package com.phamkhanh.controller;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Required;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.phamkhanh.bo.UserBO;
import com.phamkhanh.domain.User;
import com.phamkhanh.model.LoginForm;

@Controller
@RequestMapping("/login.html")
public class LoginController  { 
	
	private static final Logger logger = Logger.getLogger(LoginController.class);
	
	private UserBO userBO;

	@Autowired
	@Required
	public void setUserBO(UserBO userBO) {   
		this.userBO = userBO;
	}
	
	@RequestMapping(method = RequestMethod.GET)
	public String initLoginForm(ModelMap model, HttpServletRequest request){
		
		logger.info("Bắt đầu vào trang login.html với method = GET");
		
		// check nguoi dung da thuc su login chua thong qua session va cookie
		if(request.getSession().getAttribute("user") == null){
			logger.info("- Người dùng chưa có session đăng nhập");
			Cookie uidCookie = this.getCookie("uid", request);
			if(uidCookie != null){
				logger.info("- Người dùng có cookie đăng nhập");
				int uid = Integer.parseInt(uidCookie.getValue());  // Co kha nang bung NumberFormatException
				User user = userBO.findById(uid);                  // Co kha nang bung DataAcessException
				request.getSession().setAttribute("user", user);
				logger.info("- Tạo session đăng nhập thông qua cookie");
			}
		}
		
		// Neu chua thuc su dang nhap thi render form dang nhap (login.jsp)
		// Neu thuc su dang nhap, redirect ve index.jsp
		if(request.getSession().getAttribute("user") == null){
			logger.info("- Tạo form đăng nhập cho người dùng");
			LoginForm loginForm = new LoginForm();
			loginForm.setRemember(true);
			model.addAttribute("loginForm", loginForm);
			return "login.jsp";
		}else{
			logger.info("- Chuyển hướng người dùng về trang index.html");
			return "redirect:index.html";
		}
	}
	
	
	
	
	
	
	@RequestMapping(method = RequestMethod.POST)
	public String loginAction(@Valid @ModelAttribute("loginForm") LoginForm loginForm,
			BindingResult result, ModelMap model, HttpServletRequest request, HttpServletResponse response){
		logger.info("Bắt đầu sử lí đăng nhập với request POST ");
		logger.info(model);
		if(!result.hasErrors()){
			logger.info("- Người dùng nhập đúng thông tin");
			User user = userBO.findByUserNamePassword(loginForm.getUserName(), loginForm.getPassword());
			if(user == null){
				logger.info("- Không tồn tại userName & password trong CSDL, hiển thị lại form đăng nhập");
				result.reject(null,"userName and password not correct");
				return "login.jsp"; 
			}else {
				logger.info("- Tồn tại userName & password trong CSDL, tạo session đăng nhập");
				request.getSession().setAttribute("user", user);
				if(loginForm.isRemember()){
					logger.info("- User chọn tự động đăng nhập, tạo cookie");
					Cookie cookie = new Cookie("uid", ""+user.getUid());
					cookie.setMaxAge(60*60*24*30*6);
					response.addCookie(cookie);
				}
				model.remove("loginForm");
				logger.info(model);
				logger.info(request.getSession().getAttributeNames());
				return "redirect:index.html";
			}
		}else{
			logger.info("- Người dùng nhập thông tin không đúng");
			return "login.jsp";
		}
			
	}
	
	
	
	
	/**
	 * Method get Cookie object by name, if not exist Cookie corresponding to name , return null
	 * @param name 
	 * 				name of Cookie want to get
	 * @param request
	 * 				HttpServletRequest contains Cookies
	 */
	public Cookie getCookie(String name, HttpServletRequest request){
		Cookie[] cookies = request.getCookies();
		if(cookies != null){
			for(Cookie cookie : cookies){
				if(cookie.getName().equals(name)) return cookie;
			}
		}
		return null;
	}
	
	
}
